package com.bzkj.basicinfo.service.warehouse;

import com.bzkj.basicinfo.domain.warehouse.PdaWarehouseInBillsDetail;
import com.bzkj.basicinfo.domain.warehouse.PdaWarehouseInBillsList;
import com.bzkj.common.core.domain.AjaxResult;

import java.util.List;

/**
 * 入库单据Service接口
 *
 * @author system
 * @date 2025-10-17
 */
public interface IPdaWarehouseInBillsService {
    
    /**
     * 查询入库单据列表
     * 
     * @param billsList 入库单据主表
     * @return 入库单据集合
     */
    List<PdaWarehouseInBillsList> selectPdaWarehouseInBillsList(PdaWarehouseInBillsList billsList);

    /**
     * 查询入库单据详情
     * 
     * @param billsID 单据号
     * @return 入库单据
     */
    List<PdaWarehouseInBillsDetail> selectPdaWarehouseInBillsByBillsID(String billsID);

    /**
     * 新增入库单据
     * 
     * @param billsList 入库单据主表
     * @return 结果
     */
    int insertPdaWarehouseInBillsList(PdaWarehouseInBillsList billsList);

    /**
     * 修改入库单据
     * 
     * @param billsList 入库单据主表
     * @return 结果
     */
    int updatePdaWarehouseInBillsList(PdaWarehouseInBillsList billsList);

    /**
     * 批量删除入库单据
     * 
     * @param billsIDs 需要删除的入库单据主键集合
     * @return 结果
     */
    int deletePdaWarehouseInBillsByBillsIDs(String[] billsIDs);

    /**
     * 删除入库单据信息
     *
     * @param billsID 入库单据主键
     * @return 结果
     */
    int deletePdaWarehouseInBillsByBillsID(String billsID);

    /**
     * 提取单据（状态从0变为1）
     *
     * @param billsID 单据号
     * @return 结果
     */
    int extractBills(String billsID);

    /**
     * PDA完成操作（状态从1变为2）
     *
     * @param billsID 单据号
     * @return 结果
     */
    int pdaCompleted(String billsID);
    /**
     * PDA完成上架（状态从2变为3）
     *
     * @param billsID 单据号
     * @return 结果
     */
    int pdaGrounding(String billsID);

    /**
     * 签字操作（状态从2变为3，同时加减库存）
     *
     * @param billsID 单据号
     * @param signUserId 签字人ID
     * @param signUserName 签字人姓名
     * @return 结果
     */
    int signBills(String billsID, String signUserId, String signUserName);

    /**
     * 作废操作（状态变为4）
     *
     * @param billsID 单据号
     * @param reason 作废原因
     * @return 结果
     */
    int cancelBills(String billsID, String reason);

    /**
     * 确认收货并拆分批次（状态从0变为1）
     *
     * @param billsID 单据号
     * @param detailList 批次明细列表（包含批次拆分后的明细）
     * @param receiverUserId 收货人ID
     * @param receiverUserName 收货人姓名
     * @return 结果
     */
    AjaxResult confirmReceiveWithBatch(String billsID, List<PdaWarehouseInBillsDetail> detailList,
                                       String receiverUserId, String receiverUserName);

    /**
     * 收货拒收操作（状态从0变为4）
     *
     * @param billsID 单据号
     * @param rejectReason 拒收原因
     * @param rejectUserId 拒收人ID
     * @param rejectUserName 拒收人姓名
     * @return 结果
     */
    AjaxResult rejectReceive(String billsID, String rejectReason,
                            String rejectUserId, String rejectUserName);

    /**
     * 查询待验收的单据列表（状态为1-已到货待验收）
     *
     * @param billsList 查询条件
     * @return 入库单据集合
     */
    List<PdaWarehouseInBillsList> selectPendingInspectList(PdaWarehouseInBillsList billsList);

    /**
     * 执行验收操作（状态从1变为2）
     *
     * @param billsID 单据号
     * @param detailList 验收明细列表
     * @param acceptUserId 验收人ID
     * @param acceptUserName 验收人姓名
     * @return 结果
     */
    AjaxResult inspectGoods(String billsID, List<PdaWarehouseInBillsDetail> detailList,
                           String acceptUserId, String acceptUserName);

    /**
     * 验收拒收操作（状态从1变为4）
     *
     * @param billsID 单据号
     * @param rejectReason 拒收原因
     * @param acceptUserId 验收人ID
     * @param acceptUserName 验收人姓名
     * @return 结果
     */
    AjaxResult rejectInspect(String billsID, String rejectReason,
                            String acceptUserId, String acceptUserName);

    /**
     * 查询待上架的单据列表（状态为2-验收完成待上架）
     *
     * @param billsList 查询条件
     * @return 入库单据集合
     */
    List<PdaWarehouseInBillsList> selectPendingShelvingList(PdaWarehouseInBillsList billsList);

    /**
     * 上架异常操作（状态从2变为4）
     *
     * @param billsID 单据号
     * @param exceptionReason 异常原因
     * @param shelvingUserId 上架人ID
     * @param shelvingUserName 上架人姓名
     * @return 结果
     */
    AjaxResult shelvingException(String billsID, String exceptionReason,
                                String shelvingUserId, String shelvingUserName);
}

